Software development processes have been developed to improve the productivity and quality of the software product over the entire lifecycle of the program. As personal and business computing processors have migrated from single core processing units (CPU) to multiple core CPUs and graphical processing units (GPU), computer software is being transitioning from being highly sequential to highly parallel.
FIG. 1 is a schematic flowchart of a sequential processing computer architecture 10 with a single instruction stream and single data stream. Sequential processing refers to the execution of computer codes on a hardware architecture where a single processor executes a single stream of instructions from the instruction pool 12 to operate on data that is stored in memory in the data pool 16. The sequential implementation of the software that is programmed by the software developer resides in the instruction pool 12. A single serial stream of instructions is sent to a single processing unit (PU) 14 from the instruction pool 12 as the program is executed. The PU 14 receives data from the data pool 16 in a single serial stream. The representation of the sequential processing architecture 10 is referred to in the literature as an element of Flynn's taxonomy of computer architectures as single stream instruction, single stream data (SISD). The most well-known example of this architecture is the traditional single processor machines used in PCs through the 1980's and 1990's.
FIG. 2 is a schematic flowchart of a parallel processing computer architecture 20 with a single instruction stream and multiple data stream. Parallel processing refers to any computer architecture where distinct calculations can be carried out concurrently. In one parallel processing architecture, the execution of a parallel computer code occurs where multiple processors execute a single stream of instructions from the instruction pool 22 to operate on multiple streams of data that is stored in memory in the data pool 26. The parallel implementation of the software that is programmed by the software developer resides in the instruction pool 22. A single serial stream of instructions is sent to a set of processing units (PU) 24 from the instruction pool 22 as the program is executed. The PUs 24 each receive a stream of data from the data pool 26. This representation of the parallel processing architecture 20 is referred to in the literature as an element of Flynn's taxonomy of computer architectures as single stream instruction, multiple stream data (SIMD). The SIMD architecture is implemented in GPUs and most multi-core CPUs.
In a typical software development process, programmers pick a processing environment and develop for that selected environment. Consequently, a developer tasked with creating an application that will operate on a parallel computing platform will develop a parallel implementation of a software product on a parallel computing platform. Parallel implementations of computer programs are known to be more difficult to write than sequential implementations because the concurrency of computations adds the potential for additional types of software bugs and resource management issues. For example, parallel programs may suffer from a type of fault known as a race condition whereby a parallel implementation of a computer program exhibits anomalous behavior due to a critical dependence of timing between the operations performed by multiple processors. These types of errors can be extremely difficult to trace and, as a result, very time-consuming to fix.
Software development processes have been developed to improve the productivity and quality of the software product over the entire lifecycle of the program. Typically, these methodologies are built upon models of the software development lifecycle and provide a plan for the developer to follow as the computer program is developed and built. Due to the serial nature of computer hardware architecture that dominated the personal computer industry for decades, sequential processing has shaped the software development processes that computer scientists have used to develop computer code. The advent and accessibility of graphics processing units (GPUs) and multi-core central processing units (CPUs) has brought parallel computing to the mainstream of both business and personal computing. As a result, software development processes are inadequate and inefficient for the development and deployment of parallel software.
FIG. 3 is a schematic flowchart of the sequential design process for software development known as the Waterfall model 30. The Waterfall model 30 is a well-known design process that was adapted from hardware design methodology and used in software development where each phase of the process is completed before the next phase is begun. The phases of the Waterfall model 30 are requirements 32, design 34, implementation 36, verification 38 and maintenance 40. Each step is consecutively coupled to the next step so the overall development process progresses upon completion of the current step to the next step and is often visualized with preceding steps above the following steps so the progression is analogous to a waterfall.
The initial step of the Waterfall model 30 for software development is the requirements stage 32. The requirements stage 32 is consecutively coupled to the design stage 34; thus, the requirements stage 32 must be completed before the design stage 34 may commence. The design stage 34 is consecutively coupled to the implementation stage 36. The implementation stage 36 is consecutively coupled to the verification stage 38. The verification stage 38 is consecutively coupled to the maintenance stage 40. Upon completion of the maintenance stage 40, the development process is complete.
Typically the goal of the requirements stage 32 is to describe the purpose of the software and develop a software requirements specification. A software requirements specification is a complete description of a software system that defines both the functional and non-functional requirements of the software to be developed. The functional requirements for the software are the set of inputs, behaviors and outputs that describe how the software will work. The functional requirements are typically documented in the requirements stage 32 as calculations and use-cases. The non-functional requirements for the software describe qualities that the software will exhibit such as speed, stability, capacity and portability. The non-functional requirements are criteria that will dictate the system architecture.
The design stage 34 is a process of planning a specific software solution that will meet the purpose and requirements previously specified in the requirements stage 32. During the design stage 34, software developers will consider the functional and non-functional requirements and develop a software model that will detail the fundamental design of the software to be implemented. Typical considerations during software design are compatibility, modularity, reliability, usability, robustness, etc. The fundamental design of the software model will describe a hierarchy or framework that describes the software architecture. The software architecture will describe individual software components or modules and how the modules will interconnect. The output of the design stage 34 is documentation of the software model and may be a plain text description, a flowchart or a hierarchal description in a modeling language like Unified Modeling Language (UML).
The implementation stage 36 is the phase in the software development cycle where the computer code is actually written. The technical description from the design stage is realized as a software program or component. The program is intended to comply with the software requirements from the requirements stage 32 by being a direct implementation of the software design from the design stage 34.
The verification stage 38 of the software development cycle is the process where the implemented software is tested against the software requirements and design to substantiate that the program has been built correctly and to specification. Software verification is a methodical process where tests are written to validate that software performs as specified. If the software does not pass the validation tests, the program is debugged to find and reduce defects. Upon completion of the verification stage 38 of the Waterfall development process 30, the software is installed and maintained. The maintenance stage 40 of the software development process occurs after the software system has been installed on the end user platform. At this point, the end user will identify previously unknown bugs or performance issues. Typically, software systems developed under the Waterfall model 30 will begin to evolve as end users' software requirements change when using a fielded system. Therefore, the maintenance stage 40 is the phase where a software system migrates away from the software requirements and design developed under the Waterfall model 30 in response to dynamic needs of the end user.